ESP32 通过HTTPS进行OTA更新固件(在platform上进行编码)

您所在的位置:网站首页 esp32 固件减肥 ESP32 通过HTTPS进行OTA更新固件(在platform上进行编码)

ESP32 通过HTTPS进行OTA更新固件(在platform上进行编码)

2024-07-14 20:01| 来源: 网络整理| 查看: 265

ESP32 通过HTTPS进行OTA更新固件(在platform上进行编码)

目录 ESP32 通过HTTPS进行OTA更新固件(在platform上进行编码)1、OTA技术 简介2、本章介绍3、HTTPS OTA更新流程3.1、HTTP OTA更新流程3.2、HTTPS OTA更新流程 4、HTTPS OTA具体实现4.1、编写要更新的固件4.2、在Amazon S3存储桶上储存要更新的固件。(firmware.bin)4.2、获取Amazon S3网站证书4.3、编写HTTPS OTA更新固件程序4.4、编写好程序,编译完成,烧录到ESP32中按下rebot键开始OTA更新。 5.问题5.1 问题一:证书不对5.2 问题二:能下载固件,但是还是更新失败

1、OTA技术 简介

OTA:Over-the-Air Technology,字面意思理解为:空中下载技术。OTA 在线升级:通过OTA的方式实现产品软件更新的一种方式。 简单说来,就是通过无线方式对esp32进行固件更新,而不是通过传统的连接数据线的方式更新固件。

2、本章介绍

写本篇文章的目的就是想向大家介绍一种ESP32 OTA更新固件的方法——通过HTTPS进行更新,本篇文章是在vscode+platform环境下进行,下载方法参考这篇文章。ESP32 PlatformIO IDE 安装教程

3、HTTPS OTA更新流程 3.1、HTTP OTA更新流程

要知道HTTPS OTA更新流程之前先要知道HTTP OTA更新流程。 在这里插入图片描述

①.将ESP32连接到AP。例如手机热点②.在PC上将要更新的固件进行build。③.将.bin文件上传服务器。④.ESP32自动下载。

3.2、HTTPS OTA更新流程

HTTPS和HTTP唯一的区别就是HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,所以要通过HTTPS进行OTA更新就需要获得网站的证书。

4、HTTPS OTA具体实现 4.1、编写要更新的固件

为了确保更新的固件能正常运行,并且能看到更新后的效果所以我们写一个闪灯的程序。(先编译烧录到ESP32中看效果)

我的配置(LED):

[env:esp32cam] platform = espressif32 board = esp32cam framework = arduino monitor_speed = 115200 lib_deps = yoursunny/esp32cam@^0.0.20221229

ESP32闪灯程序 效果:LED灯一亮一灭间隔为1s。

#include // Set LED_BUILTIN if it is not defined by Arduino framework #define LED_BUILTIN 4 // 白色LED对应针脚 void setup() { // initialize LED digital pin as an output. pinMode(LED_BUILTIN, OUTPUT); } void loop() { // turn the LED on (HIGH is the voltage level) digitalWrite(LED_BUILTIN, HIGH); // wait for a second delay(1000); // turn the LED off by making the voltage LOW digitalWrite(LED_BUILTIN, LOW); // wait for a second delay(1000); } 4.2、在Amazon S3存储桶上储存要更新的固件。(firmware.bin)

亚马逊云科技分国际区和中国区,我试过在中国区即使将权限设置为所有人访问也不能读取文件,原因是在中国区要使用S3先联系AWS售后支持进行ICP备案。所以我把固件放在国际区的S3上。 具体实现: 1、登录AWS国际区账号。 2、在搜索栏搜索S3,进入创建S3存储桶。 在这里插入图片描述

在这里插入图片描述

3、创建AWS S3的详细设置。 3.1、S3存储桶名称,AWS区域。 注意命名规则,和存储桶名称必须全局唯一。 在这里插入图片描述

3.2、设置对象所有权。 在这里插入图片描述

3.3、存储桶公共访问权设置。 不勾选阻止所有公开访问,勾选我了解选项不然不能创建。 在这里插入图片描述

3.4、存储桶版本控制设置。 禁用存储桶版本控制 在这里插入图片描述

3.5、默认加密设置。 在这里插入图片描述

3.6、创建存储桶。 4、设置AWS S3权限。 4.1、点击创建的S3存储桶。 在这里插入图片描述

4.2、进入创建的存储桶后点击权限。 在这里插入图片描述

4.3、往下翻找到访问控制列表(ACL),点击编辑,设置访问控制列表。 在这里插入图片描述

4.4、找到所有人(公有访问权限),点击列出。点击我了解,不然不能保存更改。 在这里插入图片描述

4.5、点击保存更改。 5.1、保存完之后退出到AWS S3可以看到创建的存储桶的访问变为公开。 在这里插入图片描述

6、上传闪灯程序的.bin文档。 6.1、切换到我们写的闪灯程序,点击烧录,生成.bin文档。 在这里插入图片描述

6.2、进入我们创建的存储桶,点击上传。 在这里插入图片描述

6.3、上传.bin文档。 在这里插入图片描述

6.3.1、.bin文档访问控制列表设置。 在这里插入图片描述

6.3.2、点击上传。 7、文档上传成功可以在存储桶中看到。 在这里插入图片描述

8、检验是否任何人都能下载文档。 8.1、点击上传的文档。 在这里插入图片描述

8.2、复制对象 URL。 在这里插入图片描述

8.3、打开浏览器的无痕浏览,将复制的URL输入进去。 8.4、弹出下载框就说明S3存储桶设置正确。 在这里插入图片描述

4.2、获取Amazon S3网站证书

可以使用openssl来获取网站证书。 openssl是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。 1、打开openssl 在这里插入图片描述

2、输入指令查看AWS S3证书。 我的指令是: 注意替换后面的URL改为自己的URL

openssl s_client -showcerts -connect www.esp32-ota-test2.s3.amazonaws.com:443

3、查看获得的证书。 在这里插入图片描述

我获得的证书一共有三个,但是第一和第三个我试过没用,只能用第二个。大家可以试试其他两个证书。

4.3、编写HTTPS OTA更新固件程序

上述要准备的东西都准备好后就可以开始编写更新固件的程序了。 1、新建一个platform项目。 在这里插入图片描述

2、输入项目名称,开发板,和项目的位置。 在这里插入图片描述

3、点击创建,打开刚刚创建的项目。 将下面的代码粘贴到main.cpp文件中。 注意在新建的项目中的platform.ini文件中增加一行,为了在监控中不出现乱码

monitor_speed = 115200

注意替换代码中的ssid,password和url。

// This sketch provide the functionality of OTA Firmware Upgrade #include "WiFi.h" #include "HttpsOTAUpdate.h" #include "esp_ota_ops.h" // This sketch shows how to implement HTTPS firmware update Over The Air. // Please provide your WiFi credentials, https URL to the firmware image and the server certificate. static const char *ssid = "your-ssid"; // your network SSID (name of wifi network) static const char *password = "your-password"; // your network password static const char *url = "https://example.com/firmware.bin"; //state url of your firmware image static const char *server_certificate = "-----BEGIN CERTIFICATE-----\n" \ xxxxxxxxxxxxxxxxxxxxxxxxxx "-----END CERTIFICATE-----"; static HttpsOTAStatus_t otastatus; void HttpEvent(HttpEvent_t *event) { switch(event->event_id) { case HTTP_EVENT_ERROR: Serial.println("Http Event Error"); break; case HTTP_EVENT_ON_CONNECTED: Serial.println("Http Event On Connected"); break; case HTTP_EVENT_HEADER_SENT: Serial.println("Http Event Header Sent"); break; case HTTP_EVENT_ON_HEADER: Serial.printf("Http Event On Header, key=%s, value=%s\n", event->header_key, event->header_value); break; case HTTP_EVENT_ON_DATA: break; case HTTP_EVENT_ON_FINISH: Serial.println("Http Event On Finish"); break; case HTTP_EVENT_DISCONNECTED: Serial.println("Http Event Disconnected"); break; } } void setup(){ Serial.begin(115200); Serial.print("Attempting to connect to SSID: "); WiFi.begin(ssid, password); // attempt to connect to Wifi network: while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(1000); } Serial.print("Connected to "); Serial.println(ssid); HttpsOTA.onHttpEvent(HttpEvent); Serial.println("Starting OTA"); HttpsOTA.begin(url, server_certificate); Serial.println("Please Wait it takes some time ..."); } void loop(){ otastatus = HttpsOTA.status(); if(otastatus == HTTPS_OTA_SUCCESS) { Serial.println("Firmware written successfully. To reboot device, call API ESP.restart() or PUSH restart button on device"); ESP.restart(); } else if(otastatus == HTTPS_OTA_FAIL) { Serial.println("Firmware Upgrade Fail"); } delay(1000); }

4、在项目文件中添加partition.csv文件。 文件中内容为:

# Name Type SubType Offset Size Flags nvs, data, nvs, 0x9000, 0x5000 otadata,data, ota, 0xe000, 0x2000 app0, app, ota_0, 0x10000, 0x140000 app1, app, ota_1, 0x150000, 0x140000 spiffs, data, spiffs, 0x290000, 0x170000

在这里插入图片描述

5、在platform.ini文件中添加下列代码。

board_build.partitions = partition.csv

目的是设置esp32-cam的分区表。 6、编译main.cpp文件。 在这里插入图片描述

编译成功后的画面 在这里插入图片描述

7、烧录main.cpp文件。 确保esp32-cam连接到电脑并且处于下载模式。 在这里插入图片描述

烧录成功后的画面。 在这里插入图片描述

4.4、编写好程序,编译完成,烧录到ESP32中按下rebot键开始OTA更新。

1、打开手机热点。 2、摘下esp32-cam的跳线帽,使其处于运行调试模式。 3、打开Serial Monitor查看esp32-cam运行情况按下esp32-cam上的rebot按钮。 在这里插入图片描述

4、esp32-cam进行ota更新。 Serial.Monitor信息 在这里插入图片描述

至此成功实现esp32-cam的ota更新。

5.问题

我在实现这个过程中遇到过不少问题我在文章中写下做个记录。

5.1 问题一:证书不对

如果获取的证书不对,运行结果直接显示错误,所以证书一定要正确。

5.2 问题二:能下载固件,但是还是更新失败

我返回的错误代码:ESP_ERR_OTA_PARTITION_CONFLICT 原因是:分区保持着正确的运行固件,不能更新到这个这个地方。

其他错误代码请看 错误代码。

要解决这个问题我们就要知道ESP32是怎么分区的。 ESP32-Flash分区,基于PlatfromIO-Arduino

我们在项目中添加partition.csv的文件在里面添加一个分区ota_1就能解决问题。 在这里插入图片描述

# Name Type SubType Offset Size Flags nvs, data, nvs, 0x9000, 0x5000 otadata,data, ota, 0xe000, 0x2000 app0, app, ota_0, 0x10000, 0x140000 app1, app, ota_1, 0x150000, 0x140000 spiffs, data, spiffs, 0x290000, 0x170000

参考资料 [ESP32]点亮LED灯: https://blog.csdn.net/weixin_52636248/article/details/125350613

使用VScode开发ESP32,PlatformIO开发ESP32: https://blog.csdn.net/qlexcel/article/details/121527415

esp32学习-手把手搭建idf开发环境: https://blog.csdn.net/zppsky_123/article/details/122605515

ESP32-Flash分区,基于PlatfromIO-Arduino: https://blog.csdn.net/liahfdsaf/article/details/119010732

ESP32之 ESP-IDF 教学(十三)—— 分区表: https://blog.csdn.net/m0_50064262/article/details/122279800

esp32 Flash分区与OTA功能简析: https://blog.csdn.net/abc517789065/article/details/79891568

固件更新程序: https://github.com/espressif/arduino-esp32/tree/master/libraries/Update/examples/HTTPS_OTA_Update 返回的错误代码: https://www.cnblogs.com/shengxiaose/p/16499012.html



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3